/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dao;

import dao.exception.DAOConnectionException;
import dao.exception.DAOEnseignantException;
import dao.interfaces.DAOEnseignant;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.sql.Date;
import java.sql.PreparedStatement;
import model.Enseignant;
import model.Etudiant;
import model.Personne;

/**
 *
 *
 * @author Paul
 */
public class DAOEnseignantImpl implements DAOEnseignant {

    private DAOInit daoConnection;

    public DAOEnseignantImpl(DAOInit daoConnection) {
        this.daoConnection = daoConnection;
    }

    public void create(Enseignant obj) throws DAOEnseignantException{
        String query = "INSERT INTO `personne`( `nom`, `prenom`, `dateNaissance`, `typeUtilisateur`, `login`, `password`) VALUES (?,?,?,?,?,?);";
        int nb = 0;
        int autoIncKeyFromApi = -1;
        PreparedStatement ps = null;
        /**
         * lancement de la connexion à la bd et de la requete *
         */
        try {
            Connection conn = daoConnection.getConnection();//Creation de la connexion
            ps = conn.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);//preparation de la requete

            /**
             * remplacement des points d'interogation dans la query par les
             * variables*
             */
            ps.setString(1, obj.getNom());
            ps.setString(2, obj.getPrenom());
            ps.setDate(3, obj.getDatenaissance());
            ps.setString(4, obj.getTypeUtilisateur());
            ps.setString(5, obj.getLogin());
            ps.setString(6, obj.getMdp());
            System.out.println(ps);
            nb = ps.executeUpdate();//lancement de la requête
            ResultSet rs = ps.getGeneratedKeys();//recupération du résultat
            if (rs.next()) {//récuperation de l'id 
                autoIncKeyFromApi = rs.getInt(1);
                System.out.println(autoIncKeyFromApi);
                String query2 = "INSERT INTO `enseignant`(`id_personne`) VALUES (" + autoIncKeyFromApi + ");";
                System.out.println(query2);
                ps = conn.prepareStatement(query2, Statement.RETURN_GENERATED_KEYS);//preparation de la requete
                nb = ps.executeUpdate();
                System.out.println(nb);
            }
        } catch (SQLException e) {
            throw new DAOEnseignantException("Erreur d'insertion de l'enseignant : veuillez voir avec l'administrateur du site");
        }
    }

    public Enseignant rechercheProf(String login, String mdp) throws DAOEnseignantException {

        PreparedStatement st = null;
        Enseignant p = null;
        try {
            Connection conn = daoConnection.getConnection();
            String query = "select p.login,p.password,p.nom,p.prenom,e.id_enseignant,e.id_personne,p.typeUtilisateur from personne p,enseignant e where p.login='" + login + "' and p.password='" + mdp + "' and p.id_personne=e.id_personne;";
            st = conn.prepareStatement(query);
            ResultSet res = st.executeQuery(query);
            if (res.next()) {
                String log = res.getString("login");
                String password = res.getString("password");
                String nom = res.getString("nom");
                String prenom = res.getString("prenom");
                int idp = res.getInt("id_personne");
                int ide = res.getInt("id_enseignant");
                String type = res.getString("typeUtilisateur");
                java.sql.Date d = null;
                p = new Enseignant(ide, idp, nom, prenom, d, type, log, password);
            } else {
                throw new DAOEnseignantException("Erreur de connexion : veuillez voir avec l'administrateur du site");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return p;
    }

    public void update(Enseignant obj) {
        String query = "UPDATE `enseignant` SET `id_enseignant`=['" + obj.getId() + "'],`id_personne`=[value-2] WHERE 1";

    }

    public boolean delete(Personne obj) {
        String query = "DELETE FROM `enseignant` WHERE `id_personne`= ?";
        boolean del = false;
        Integer nb = 0;
        int autoIncKeyFromApi = -1;
        PreparedStatement ps = null;
        try {
            Connection conn = daoConnection.getConnection();//Creation de la connexion
            ps = conn.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);//preparation de la requete
            System.out.println(ps);
            /**
             * remplacement des points d'interogation dans la query par les
             * variables*
             */
            ps.setObject(1, obj.getId());
            System.out.println(obj.getId());
            // System.out.println(obj.getId());
            nb = ps.executeUpdate();//lancement de la requête
            ResultSet rs = ps.getGeneratedKeys();//recupération du résultat
            if (rs.next()) {//récuperation de l'id 
                autoIncKeyFromApi = rs.getInt(1);
                System.out.println(autoIncKeyFromApi);
                System.out.println(nb);
                System.out.println("Delete OK");
            }
            if (nb >= 1) {
                del = true;
            }
            return del;

        } catch (SQLException e) {
            e.printStackTrace();

        }
        return false;
    }

    public ArrayList<Enseignant> getAll() {
        String query = "";
        return findGeneral(query);
    }

    public Enseignant find(int id) {
        String query = "";
        Enseignant enseignant = null;
        enseignant = findGeneral(query).get(0);
        return enseignant;
    }

//---------------------------------------------------------private method--------------------------------------------------------------------//
    private ArrayList<Enseignant> findGeneral(String requete) {
        ArrayList<Enseignant> enseignants = new ArrayList<Enseignant>();
        Statement st = null;
        Enseignant enseignant = null;

        try {
            Connection conn = daoConnection.getConnection();
            st = conn.createStatement();
            ResultSet res = st.executeQuery(requete);
            while (res.next()) {
                enseignant = createObject(res);
                enseignants.add(enseignant);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return enseignants;
    }

    private Enseignant createObject(ResultSet res) {
        Enseignant enseignant = null;
        try {
            Integer id = res.getInt("id_personne");
            String nom = res.getString("nom");
            String prenom = null;
            Date datenaissance = null;
            String type = null;
            String login = null;
            enseignant = new Enseignant(id, nom, prenom, datenaissance, type, login, "");
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return enseignant;
    }
}
